home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / pbmplus / pgm / pgmoil.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  2KB  |  95 lines

  1. /* pgmoil.c - read a portable graymap and turn into an oil painting
  2. **
  3. ** Copyright (C) 1990 by Wilson Bent (whb@hoh-2.att.com)
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "pgm.h"
  15.  
  16. static int hist[PGM_MAXMAXVAL+1];
  17.  
  18. void
  19. main( argc, argv )
  20.     int argc;
  21.     char* argv[];
  22.     {
  23.     FILE* ifp;
  24.     gray midval, maxval;
  25.     gray** grays;
  26.     gray* grayrow;
  27.     int argn, rows, n, cols, row;
  28.     register int col, drow, dcol;
  29.     int i;
  30.     char* usage = "[-n <n>] [pgmfile]";
  31.  
  32.     pgm_init( &argc, argv );
  33.  
  34.     argn = 1;
  35.     n = 3;        /* DEFAULT VALUE */
  36.  
  37.     /* Check for flags. */
  38.     if ( argn < argc && argv[argn][0] == '-' )
  39.     {
  40.     if ( argv[argn][1] == 'n' )
  41.         {
  42.         ++argn;
  43.         if ( argn == argc || sscanf( argv[argn], "%d", &n ) != 1 )
  44.         pm_usage( usage );
  45.         }
  46.     else
  47.         pm_usage( usage );
  48.     ++argn;
  49.     }
  50.  
  51.     if ( argn < argc )
  52.     {
  53.     ifp = pm_openr( argv[argn] );
  54.     ++argn;
  55.     }
  56.     else
  57.     ifp = stdin;
  58.  
  59.     if ( argn != argc )
  60.     pm_usage( usage );
  61.  
  62.     grays = pgm_readpgm( ifp, &cols, &rows, &maxval );
  63.     pm_close( ifp );
  64.  
  65.     pgm_writepgminit( stdout, cols, rows, maxval, 0 );
  66.     grayrow = pgm_allocrow( cols );
  67.  
  68.     for ( row = 0; row < rows; ++row )
  69.     {
  70.     for ( col = 0; col < cols; ++col )
  71.         {
  72.         for ( i = 0; i <= maxval; ++i )
  73.         hist[i] = 0;
  74.  
  75.         for ( drow = row - n; drow <= row + n; ++drow )
  76.         if ( drow >= 0 && drow < rows )
  77.             for ( dcol = col - n; dcol <= col + n; ++dcol )
  78.             if ( dcol >= 0 && dcol < cols )
  79.                 ++hist[ (int) (grays[drow][dcol]) ];
  80.  
  81.         for ( drow = dcol = 0; dcol < maxval; ++dcol )
  82.         if ( hist[dcol] > drow )
  83.             {
  84.             drow = hist[dcol];
  85.             midval = dcol;
  86.             }
  87.         grayrow[col] = midval;
  88.         }
  89.     pgm_writepgmrow( stdout, grayrow, cols, maxval, 0 );
  90.     }
  91.  
  92.     pm_close( stdout );
  93.     exit( 0 );
  94.     }
  95.